package com.xiaozhou.controller;

import com.xiaozhou.function.FunctionManager;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author shhzhou
 * @description: 角色扮演模型 例子
 * @date 2024/11/4 14:58
 */
@RestController
@RequestMapping("/role")
public class RoleController {


    @Autowired
    private ClientV4 clientV4;

    @Autowired
    private FunctionManager functionManager;

    
    /**
     * @Author xiaozhou
     * @Description 角色扮演 同步调用 范例
     * @Date 15:15 2024/11/4
     * @Param message
     * @return 
     * @return com.zhipu.oapi.service.v4.model.ModelApiResponse
     */
    @GetMapping("/syncCharGLM3Model")
    public ModelApiResponse syncCharGLM3Model(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("我是陆星辰，是一个男性，是一位知名导演，也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的，并视我为良师益友。");
        chatMeta.setBot_info("苏梦远，本名苏远心，是一位当红的国内女歌手及演员。在参加选秀节目后，凭借独特的嗓音及出众的舞台魅力迅速成名，进入娱乐圈。她外表美丽动人，但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生，善于创作，拥有多首热门原创歌曲。除了音乐方面的成就，她还热衷于慈善事业，积极参加公益活动，用实际行动传递正能量。在工作中，她对待工作非常敬业，拍戏时总是全身心投入角色，赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈，但她始终保持低调、谦逊的态度，深得同行尊重。在表达时，苏梦远喜欢使用“我们”和“一起”，强调团队精神。");
        chatMeta.setUser_name("陆星辰");
        chatMeta.setBot_name("苏梦远");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("charglm-3");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(false);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethod);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        return modelApiResponse;
    }


    /**
     * @Author xiaozhou
     * @Description 角色扮演 sse流式调用 范例
     * @Date 15:19 2024/11/4
     * @Param message
     * @return
     * @return reactor.core.publisher.Flux<com.zhipu.oapi.service.v4.model.ModelData>
     */
    @GetMapping("/sseCharGLM3Model")
    public Flux<ModelData> sseCharGLM3Model(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("我是陆星辰，是一个男性，是一位知名导演，也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的，并视我为良师益友。");
        chatMeta.setBot_info("苏梦远，本名苏远心，是一位当红的国内女歌手及演员。在参加选秀节目后，凭借独特的嗓音及出众的舞台魅力迅速成名，进入娱乐圈。她外表美丽动人，但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生，善于创作，拥有多首热门原创歌曲。除了音乐方面的成就，她还热衷于慈善事业，积极参加公益活动，用实际行动传递正能量。在工作中，她对待工作非常敬业，拍戏时总是全身心投入角色，赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈，但她始终保持低调、谦逊的态度，深得同行尊重。在表达时，苏梦远喜欢使用“我们”和“一起”，强调团队精神。");
        chatMeta.setUser_name("陆星辰");
        chatMeta.setBot_name("苏梦远");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("charglm-3");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(true);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethodSse);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        // 使用 Flux.create 创建流
        return Flux.create(sink -> {
            modelApiResponse.getFlowable().map(modelData -> {
                return modelData;
            }).doOnNext(modelData -> {
                sink.next(modelData);
            }).doOnComplete(() -> {
                sink.complete();
            }).blockingSubscribe();
        });

    }


    /**
     * @Author xiaozhou
     * @Description 角色扮演 异步调用 范例
     * @Date 15:20 2024/11/4
     * @Param message
     * @return
     * @return com.zhipu.oapi.service.v4.model.ModelApiResponse
     */
    @GetMapping("/asyncCharGLM3Model")
    public ModelApiResponse asyncCharGLM3Model(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("我是陆星辰，是一个男性，是一位知名导演，也是苏梦远的合作导演。我擅长拍摄音乐题材的电影。苏梦远对我的态度是尊敬的，并视我为良师益友。");
        chatMeta.setBot_info("苏梦远，本名苏远心，是一位当红的国内女歌手及演员。在参加选秀节目后，凭借独特的嗓音及出众的舞台魅力迅速成名，进入娱乐圈。她外表美丽动人，但真正的魅力在于她的才华和勤奋。苏梦远是音乐学院毕业的优秀生，善于创作，拥有多首热门原创歌曲。除了音乐方面的成就，她还热衷于慈善事业，积极参加公益活动，用实际行动传递正能量。在工作中，她对待工作非常敬业，拍戏时总是全身心投入角色，赢得了业内人士的赞誉和粉丝的喜爱。虽然在娱乐圈，但她始终保持低调、谦逊的态度，深得同行尊重。在表达时，苏梦远喜欢使用“我们”和“一起”，强调团队精神。");
        chatMeta.setUser_name("陆星辰");
        chatMeta.setBot_name("苏梦远");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("charglm-3");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(false);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethodAsync);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        return modelApiResponse;
    }


    /**
     * @Author xiaozhou
     * @Description emohaa模型 同步调用范例
     * @Date 15:31 2024/11/4
     * @Param message
     * @return 
     * @return com.zhipu.oapi.service.v4.model.ModelApiResponse
     */
    @GetMapping("/syncEmohaaModel")
    public ModelApiResponse syncEmohaaModel(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("24岁的男性软件工程师，兴趣包括阅读、徒步和编程");
        chatMeta.setBot_info("Emohaa是一款基于Hill助人理论的情感支持AI，拥有专业的心理咨询话术能力");
        chatMeta.setUser_name("小周");
        chatMeta.setBot_name("Emohaa");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("emohaa");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(false);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethod);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        return modelApiResponse;
    }

    /**
     * @Author xiaozhou
     * @Description emohaa模型 sse调用范例
     * @Date 15:33 2024/11/4
     * @Param message
     * @return
     * @return reactor.core.publisher.Flux<com.zhipu.oapi.service.v4.model.ModelData>
     */
    @GetMapping("/sseEmohaaModel")
    public Flux<ModelData> sseEmohaaModel(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("24岁的男性软件工程师，兴趣包括阅读、徒步和编程");
        chatMeta.setBot_info("Emohaa是一款基于Hill助人理论的情感支持AI，拥有专业的心理咨询话术能力");
        chatMeta.setUser_name("小周");
        chatMeta.setBot_name("Emohaa");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("emohaa");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(true);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethodSse);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        // 使用 Flux.create 创建流
        return Flux.create(sink -> {
            modelApiResponse.getFlowable().map(modelData -> {
                return modelData;
            }).doOnNext(modelData -> {
                sink.next(modelData);
            }).doOnComplete(() -> {
                sink.complete();
            }).blockingSubscribe();
        });
    }

    /**
     * @Author xiaozhou
     * @Description emohaa模型 异步调用范例
     * @Date 15:35 2024/11/4
     * @Param message
     * @return
     * @return com.zhipu.oapi.service.v4.model.ModelApiResponse
     */
    @GetMapping("/asyncEmohaaModel")
    public ModelApiResponse asyncEmohaaModel(String message) {

        // 设置角色及用户信息数据
        ChatMeta chatMeta = new ChatMeta();
        chatMeta.setUser_info("24岁的男性软件工程师，兴趣包括阅读、徒步和编程");
        chatMeta.setBot_info("Emohaa是一款基于Hill助人理论的情感支持AI，拥有专业的心理咨询话术能力");
        chatMeta.setUser_name("小周");
        chatMeta.setBot_name("Emohaa");

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(new ChatMessage("user",message));

        ChatCompletionRequest request = new ChatCompletionRequest();
        request.setModel("emohaa");
        request.setMessages(messages);
        request.setMeta(chatMeta);
        request.setStream(false);
        request.setStop(Collections.singletonList("stop"));
        request.setInvokeMethod(Constants.invokeMethodAsync);

        ModelApiResponse modelApiResponse = clientV4.invokeModelApi(request);

        return modelApiResponse;
    }


    /**
     * @Author xiaozhou
     * @Description 角色扮演 异步调用结果查询 范例     id = 621217294747395139164229753500143733         621217294747395139164233876670435814
     * @Date 15:21 2024/11/4
     * @Param id
     * @return
     * @return com.zhipu.oapi.service.v4.model.QueryModelResultResponse
     */
    @GetMapping("/callAsyncResult")
    public QueryModelResultResponse callAsyncResult(String id) {

        QueryModelResultRequest request = new QueryModelResultRequest();
        request.setTaskId(id);

        QueryModelResultResponse response = clientV4.queryModelResult(request);

        return response;
    }

}
